// 题目链接：https://www.luogu.com.cn/problem/P1019

#include <iostream>
#include <string>

using namespace std;

const int N = 25;

string words[N]; // 存单词
int g[N][N];     // g[i][j]表示第j个单词能否接到第i个单词后面，如果可以g[i][j]就等于两者重合的最小部分的长度，不可以等于0
int used[N];     // 记录每个单词在“龙”中出现的次数

int n;
char start;  // 存开头的字母
int res = 0; // 存最长的“龙”的长度

// dragon表示当前所接好的龙，x表示当前在龙尾的单词序号
void DFS(string dragon, int x)
{
    // res更新为目前所接的所有“龙”的最大长度
    res = max(res, (int)dragon.size());

    // 遍历每个单词，并判断其是否能够参与接龙
    for (int i = 0; i < n; ++i)
    {
        // 如果单词和龙的尾部能够相连，并且该单词参与接龙的次数小于2，则让该单词参与接龙
        if (g[x][i] && used[i] < 2)
        {
            ++used[i];                                 // 单词接龙后，该单词的使用次数加1
            DFS(dragon + words[i].substr(g[x][i]), i); // 接下一个单词
            --used[i];                                 // 恢复现场
        }
    }
}

int main()
{
    cin >> n;
    for (int i = 0; i < n; ++i)
    {
        cin >> words[i];
    }
    cin >> start;

    // 预处理，先记录好每两个单词之间是否能接龙，重合部分的长度是多少
    for (int i = 0; i < n; ++i)
    {
        string word1 = words[i];
        for (int j = 0; j < n; ++j)
        {
            string word2 = words[j];
            for (int k = 1; k < min(word1.size(), word2.size()); ++k)
            {
                // 计算两个能接龙的单词的重合部分的最小长度
                // 因为重合部分长度越短，“龙”的长度越长
                if (word1.substr(word1.size() - k) == word2.substr(0, k))
                {
                    g[i][j] = k;
                    break;
                }
            }
        }
    }

    // 依次从每个以start开头的单词开始接龙
    for (int i = 0; i < n; ++i)
    {
        if (words[i][0] == start)
        {
            ++used[i];        // 单词接龙后，该单词的使用次数加1
            DFS(words[i], i); // 接下一个单词
            --used[i];        // 恢复现场
        }
    }

    cout << res << endl;

    return 0;
}